let a1: boolean;
// 也可以直接使用字面量进行类型声明
let a2:10;
// a2 = 11

// 可以使用 | 来连接多个类型(联合类型)
let b1 : 'male' | 'female';
b1 = 'male'
// b1 = 'hello'

let c1 :boolean | string;
c1 = true
c1 = 'hello'

// any 表示任意类型，一个变量设置为any类型后相当于对该变量关闭了ts的类型检测
// 使用ts时，不建议使用any类型
// let d1 :any   // 显示的声明为any类型

// 声明变量如果不指定类型，则ts解析器会自动判断变量的类型为any(隐式的any)
let d1;
d1 = 10
d1 = 'hello'
d1 = true

// unknown 表示未知类型的值
let e:unknown
e = 10
e = 'hello'
e = true

let s :string
// d1的类型是any,它可以赋给任意变量（any类型的变量可以赋给其他变量）（不仅霍霍自己，而且霍霍别人）
// s = d1

e = 'hello'
// s = e  // 不能把unknown类型的变量赋给其它变量（只霍霍自己，不霍霍别人）
// unknown 实际上就是一个类型安全的any
// unknown 类型的变量，不能直接赋值给其他变量

// 解决方法有2个：
// ①如果想赋值，可以先类型检查
if(typeof e === 'string'){
    s = e;
}
// ② 类型断言，可以用来告诉解析器变量的实际类型
/* 语法：
    变量 as 类型
    <类型> 变量
* 
*/
s = e as string
s = <string>e
 
// 小结：当遇到类型不确定的时候，能用unknown尽量用unknown,尽量不要用any

// void 用来表示空，以函数为例，就表示没有返回值的函数
function fn1():void{
    // return undefined 
    // return null
}   

// never 表示永远都不会返回结果
function fn2():never{
    throw new Error('报错了！')
}

// 如果命名空间在一个单独的ts文件中，则应用三斜杠/// 引用它
/// <reference path = "./04_types.ts" />

namespace SomeNameSpaceName{
    export class Circle implements ISomeInterfaceName {
         draw() {
            console.log('Circle is drawn');
         }
    }
}

// 命名空间支持嵌套，即你可以将命名空间定义在另一个命名空间中

// 声明文件
